class UploadImage {

    constructor(file) {
        this.file = file
    }

    // changeFileToBaseURL(file, callback) {
    //     let fr = new FileReader()
    //     if (file) {
    //         fr.readAsDataURL(file)
    //         fr.onload = function() {
    //             let base64 = this.result
    //             callback(base64)
    //         }
    //     } else {
    //         return callback(null)
    //     }
    // }

    changeFileToBaseURL(file) {
        let p = new Promise(resolve => {
            let fr = new FileReader()
            fr.readAsDataURL(file)
            fr.onload = function() {
                let base64 = this.result
                resolve(base64)
            }
        })
        return p
    }


    dataURLtoFile(dataURI, filename) {
        let arr = dataURI.split(',')
        let mime = arr[0].match(/:(.*?);/)[1]
        let bstr = atob(arr[1])
        let n =  bstr.length
        let u8arr = new Uint8Array(n)
        while(n--){
            u8arr[n] = bstr.charCodeAt(n);
        }
        let f = new File([u8arr], filename, {type:mime})
        return f
    }

    // getOrientation(file, callback) {
    //     let fr = new FileReader()
    //     fr.readAsArrayBuffer(file)
    //     fr.onload = function (e) {
    //         let view = new DataView(e.target.result)
    //         if (view.getUint16(0, false) !== 0xFFD8){
    //             console.log('in -2')
    //             return callback(-2)
    //             // return -2
    //         }
    //         let l = view.byteLength
    //         let offset = 2
    //         while (offset < l) {
    //             let marker = view.getUint16(offset, false)
    //             offset += 2
    //             if (marker === 0xFFE1) {
    //                 if (view.getUint32(offset += 2, false) !== 0x45786966){
    //                     console.log('in -1')
    //                     return callback(-1)
    //                     // return -1
    //                 }
    //                 let little = view.getUint16(offset += 6, false) === 0x4949
    //                 offset += view.getUint32(offset + 4, little)
    //                 const tags = view.getUint16(offset, little)
    //                 offset += 2;
    //                 for (let i = 0; i < tags; i++){
    //                     if (view.getUint16(offset + (i * 12), little) === 0x0112) {
    //                         let o = view.getUint16(offset + (i * 12) + 8, little)
    //                         console.log('in ' + o)
    //                         return callback(o)
    //                         // return view.getUint16(offset + (i * 12) + 8, little)
    //                     }
    //                 }
    //             } else if ((marker & 0xFF00) !== 0xFF00){
    //                 console.log('break')
    //                 break
    //             } else {
    //                 offset += view.getUint16(offset, false)
    //             }
    //         }
    //         // _.orientation = -
    //         console.log('-1')
    //         return callback(-1)
    //     }
    // }

    getOrientation(file) {

        let p = new Promise(resolve => {
            let fr = new FileReader()
            fr.readAsArrayBuffer(file)
            fr.onload = function (e) {
                let view = new DataView(e.target.result)
                if (view.getUint16(0, false) !== 0xFFD8){
                    // return (-2)
                    resolve(-2)
                }
                let l = view.byteLength
                let offset = 2
                while (offset < l) {
                    let marker = view.getUint16(offset, false)
                    offset += 2
                    if (marker === 0xFFE1) {
                        if (view.getUint32(offset += 2, false) !== 0x45786966){
                            // return callback(-1)
                            resolve(-1)
                        }
                        let little = view.getUint16(offset += 6, false) === 0x4949
                        offset += view.getUint32(offset + 4, little)
                        const tags = view.getUint16(offset, little)
                        offset += 2;
                        for (let i = 0; i < tags; i++){
                            if (view.getUint16(offset + (i * 12), little) === 0x0112) {
                                let o = view.getUint16(offset + (i * 12) + 8, little)
                                // return callback(o)
                                resolve(o)
                                // return view.getUint16(offset + (i * 12) + 8, little)
                            }
                        }
                    } else if ((marker & 0xFF00) !== 0xFF00){
                        break
                    } else {
                        offset += view.getUint16(offset, false)
                    }
                }
                // _.orientation = -
                resolve(-1)
                // return callback(-1)
            }
        })
        return p
    }

    drawImage({imgRef, callback}) {
        let file = this.file
        this.changeFileToBaseURL(file, callback)
    }

    async zipImage({callback, file, targetSize = -1, width = -1, height = -1, fileName = "image", quality = 0.92, orientation = -1}) {

        let size = file.size

        const oP = this.getOrientation(file)
        const fP = this.changeFileToBaseURL(file)

        if (file === undefined) {
            // resultFile = null
            let p = new Promise(resolve => {
                resolve(null)

            })
            return p
        }

        if (size < targetSize) {
            // resultFile = file
            let p = new Promise(resolve => {
                resolve(file)
            })
            return p
            // return callback(file)
        }

        let ps = Promise.all([oP, fP])
        let result = null

        let resultPromise = new Promise(resolve => {

            ps.then((values) => {
                let [o, base64,] = values

                let img = new Image()
                img.src = base64
                img.onload = () => {
                    let canvas = document.createElement('canvas')
                    let ctx = canvas.getContext('2d')

                    let w = img.width
                    let h = img.height

                    let wSide
                    let hSide
                    let finalW
                    let finalH
                    let ratio = w / h

                    if (height > -1) {

                        if (w === h) {
                            wSide = w
                            hSide = h
                            finalH = width
                            finalW = height
                        } else {
                            if (w > h) {
                                wSide = h
                                hSide = h
                                finalH = width
                                finalW = height
                            } else {
                                wSide = w
                                hSide = w
                                finalH = width
                                finalW = height
                            }
                        }
                    } else {
                        finalW = width
                        finalH = width / ratio
                        wSide = w
                        hSide = h
                    }

                    canvas.width = finalW
                    canvas.height = finalH

                    // let cw = canvas.width
                    // let ch = canvas.height


                    ctx.drawImage(img,
                        0, 0, wSide, hSide,
                        0, 0, finalW, finalH)
                    // if (o === 6 || orientation === 6) {
                    //     let x = cw / 2
                    //     let y = ch / 2
                    //
                    //     console.log(o, orientation)
                    //     if (orientation === -1) {
                    //         ctx.translate(x, y)
                    //         ctx.rotate((Math.PI / 180) * 90)
                    //         ctx.translate(-x, -y)
                    //         ctx.drawImage(img,
                    //             0, 0, wSide, hSide,
                    //             0, 0, finalW, finalH)
                    //     } else if (orientation === 6) {
                    //         ctx.drawImage(img,
                    //             0, 0, wSide, hSide,
                    //             0, 0, finalW, finalH)
                    //     }
                    //
                    // } else {
                    //     ctx.drawImage(img,
                    //         0, 0, wSide, hSide,
                    //         0, 0, finalW, finalH)
                    // }

                    let type = file.type
                    let newData = canvas.toDataURL(type, quality)
                    let resultFile = this.dataURLtoFile(newData, fileName)

                    if (targetSize !== -1 && targetSize < file.size) {
                        let type = file.type
                        if (type === 'image/png') {
                            width = width / 2
                            if (height > -1) {
                                height = height / 2
                            }
                        } else {
                            quality = quality - 0.05
                        }
                        result = this.zipImage({file: resultFile, targetSize, width, height, fileName, quality, orientation: o,})
                        resolve(result)
                        // return this.zipImage({callback, file: resultFile, targetSize, width, height, fileName, quality,})
                    } else {
                        resolve(resultFile)
                        // result = file
                        // return result
                    }

                    // resolve(resultFile)
                }
            })

        })
        return await resultPromise
    }


    // zipImage({callback, file, targetSize = -1, width = -1, height = -1, fileName = "image", quality = 0.92,}) {
    //
    //
    //     let _this = this
    //     let p = new Promise((resolve) => {
    //         _this.getOrientation(file, (o) => {
    //             if (callback) {
    //                 if (file === undefined) {
    //                     resolve(null)
    //                     // return null
    //
    //                     resolve(callback(null))
    //                 }
    //                 let size = file.size
    //                 if (size < targetSize) {
    //                     resolve(file)
    //                     // return file
    //                     resolve(callback(file))
    //                 }
    //                 _this.changeFileToBaseURL(file, (base64) => {
    //                     let img = new Image()
    //                     img.src = base64
    //                     img.onload = () => {
    //                         let canvas = document.createElement('canvas')
    //                         let ctx = canvas.getContext('2d')
    //
    //                         let w = img.width
    //                         let h = img.height
    //
    //                         let wSide
    //                         let hSide
    //                         let finalW
    //                         let finalH
    //                         let ratio = w / h
    //
    //                         if (height && height > -1) {
    //
    //                             if (w === h) {
    //                                 wSide = w
    //                                 hSide = h
    //                                 finalH = width
    //                                 finalW = height
    //                             } else {
    //                                 if (w > h) {
    //                                     wSide = h
    //                                     hSide = h
    //                                     finalH = width
    //                                     finalW = height
    //                                 } else {
    //                                     wSide = w
    //                                     hSide = w
    //                                     finalH = width
    //                                     finalW = height
    //                                 }
    //                             }
    //                         } else if (height === -1) {
    //                             finalW = width
    //                             finalH = width / ratio
    //                             wSide = w
    //                             hSide = h
    //                         }
    //
    //                         canvas.width = finalW
    //                         canvas.height = finalH
    //
    //                         let cw = canvas.width
    //                         let ch = canvas.height
    //
    //                         if (o === 6) {
    //                             let x = cw / 2
    //                             let y = ch / 2
    //                             ctx.translate(x , y)
    //                             ctx.rotate( (Math.PI / 180) * 90)
    //                             ctx.translate(-x,-y)
    //                             ctx.drawImage(img,
    //                                 0, 0, wSide, hSide,
    //                                 0, 0, finalW, finalH)
    //                         } else {
    //                             ctx.drawImage(img,
    //                                 0, 0, wSide, hSide,
    //                                 0, 0, finalW, finalH)
    //                         }
    //
    //                         let type = file.type
    //                         let newData = canvas.toDataURL(type, quality)
    //                         let resultFile = _this.dataURLtoFile(newData, fileName)
    //                         if (targetSize !== -1 && targetSize < resultFile.size) {
    //
    //                             const type = file.type
    //                             if (type === 'image/png') {
    //                                 width = width / 2
    //                                 if (height > -1) {
    //                                     height = height / 2
    //                                 }
    //                             } else {
    //                                 quality = quality - 0.05
    //                             }
    //                             // return
    //                             // console.log('file size', size)
    //                             // console.log('result',resultFile.size,)
    //                             let p = this.zipImage({callback, file: resultFile, targetSize, width, height,fileName, quality,})
    //                             // p.then((result) => resolve(result))
    //                             // return p
    //
    //                             resolve(p)
    //                             // return p
    //                         } else {
    //                             console.log('file size', size)
    //                             console.log('result',resultFile.size,)
    //                             resolve(resultFile)
    //                             // resolve(callback(resultFile))
    //                         }
    //                     }
    //                 })
    //             }
    //         })
    //     })
    //     return p
    // }


    // zipImage({callback, file, targetSize = -1, width = -1, height = -1, fileName = "image", quality = 0.92,}) {
    //
    //
    //     let _this = this
    //     _this.getOrientation(file, (o) => {
    //         if (callback) {
    //             if (file === undefined) {
    //                 return callback(null)
    //             }
    //             let size = file.size
    //             if (size < targetSize) {
    //                 return callback(file)
    //             }
    //             _this.changeFileToBaseURL(file, (base64) => {
    //                 let img = new Image()
    //                 img.src = base64
    //                 img.onload = () => {
    //                     let canvas = document.createElement('canvas')
    //                     let ctx = canvas.getContext('2d')
    //
    //                     let w = img.width
    //                     let h = img.height
    //
    //                     let wSide
    //                     let hSide
    //                     let finalW
    //                     let finalH
    //                     let ratio = w / h
    //
    //                     if (height > -1) {
    //
    //                         if (w === h) {
    //                             wSide = w
    //                             hSide = h
    //                             finalH = width
    //                             finalW = height
    //                         } else {
    //                             if (w > h) {
    //                                 wSide = h
    //                                 hSide = h
    //                                 finalH = width
    //                                 finalW = height
    //                             } else {
    //                                 wSide = w
    //                                 hSide = w
    //                                 finalH = width
    //                                 finalW = height
    //                             }
    //                         }
    //                     } else {
    //                         finalW = width
    //                         finalH = width / ratio
    //                         wSide = w
    //                         hSide = h
    //                     }
    //
    //                     canvas.width = width
    //                     canvas.height = height
    //
    //                     let cw = canvas.width
    //                     let ch = canvas.height
    //
    //                     if (o === 6) {
    //                         let x = cw / 2
    //                         let y = ch / 2
    //                         ctx.translate(x , y)
    //                         ctx.rotate( (Math.PI / 180) * 90)
    //                         ctx.translate(-x,-y)
    //                         ctx.drawImage(img,
    //                             0, 0, wSide, hSide,
    //                             0, 0, finalW, finalH)
    //                     } else {
    //                         ctx.drawImage(img,
    //                             0, 0, wSide, hSide,
    //                             0, 0, finalW, finalH)
    //                     }
    //
    //                     let type = file.type
    //                     let newData = canvas.toDataURL(type, quality)
    //                     let resultFile = _this.dataURLtoFile(newData, fileName)
    //                     if (targetSize !== -1 && targetSize < resultFile.size) {
    //                         quality = quality - 0.1
    //                         this.zipImage({callback, file: resultFile, targetSize, width, height,fileName, quality,})
    //                     } else {
    //                         callback(resultFile)
    //                     }
    //                 }
    //             })
    //         }
    //     })
    // }

}

export default UploadImage

